
#include "nane/RenderSystem/IndexBuffer.h"
#include "nane/RenderSystem/IndexBufferImpl_.h"
#include "nane/RenderSystem/RenderSystemImpl_.h"

#include "nane/core/assert.h"

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    IndexBuffer::IndexBuffer( const NullType& )
        : SubSystemProduct()
        , m( NULL )
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    IndexBuffer::IndexBuffer( Implementation* _impl )
        : SubSystemProduct( _impl )
        , m( _impl )
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    IndexBuffer::IndexBuffer( const IndexBuffer& _other )
        : SubSystemProduct( _other )
        , m( _other.m )
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint16* IndexBuffer::Lock( uint32 _offset, uint32 _size )
    {
        NANE_ASSERT_RV( m != NULL, "IndexBuffer must be valid", NULL );
        NANE_ASSERT_RV( _offset + _size <= m->size, "Range must be valid", NULL );
        uint16* bufferLock = m->creator->interface->LockIndexBuffer(m->interface, _offset, _size);
        if( bufferLock != NULL )
        {
            ++m->locks;
        }
        return bufferLock;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void IndexBuffer::Unlock()
    {
        NANE_ASSERT_R( m != NULL, "IndexBuffer must be valid" );
        NANE_ASSERT_R( m->locks > 0, "Buffer must be locked" );
        m->creator->interface->UnlockIndexBuffer(m->interface);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
